package controller

import (
	"fmt"
	beego "github.com/beego/beego/v2/server/web"
	"github.com/wechatpay-apiv3/wechatpay-go/core/notify"
	"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
	"github.com/wechatpay-apiv3/wechatpay-go/utils"
	"io/ioutil"
	"ksd-social-api/commons/base/controller"
	"ksd-social-api/commons/tools"
	utils2 "ksd-social-api/utils"
)

type WeixinNativeController struct {
	controller.BaseController
}

/*
*
* 判断微信支付回调
* @author feige
* @date 2023-12-04
* @version 1.0
* @desc
 */
func (web *WeixinNativeController) QueryOrderByOutTradeCallback() {
	fmt.Println("微信支付回调进来了")
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("微信支付：数据已保存！")
			web.Ok("ok")
		}
	}()
	// 获取你支付的回调参数, 也就是说微信服务器会把你所有的订单信息放入到请求体
	bodydata, _ := ioutil.ReadAll(web.Ctx.Request.Body)
	request := notify.Request{}
	// 开始解析你的请求体的参数
	param := string(bodydata)
	// 把请求体参数转换request对象
	tools.JsontoStruct(param, &request)
	// 准备一个map获取request中的参数信息
	tmp := make(map[string]interface{})
	// 判断当前交易是否是成功的
	if request.EventType == "TRANSACTION.SUCCESS" {
		fmt.Println("微信支付回调进来了，支付成功!!")
		mchAPIv3Key := beego.AppConfig.DefaultString("weixin.pay.mchv3key", "")
		// 把请求体中订单的数据信息获取出来。也就是request.Resource.AssociatedData, 然后通过DecryptAES256GCM的方法就RSA解密，然后得到一个json字符串
		plaintext, _ := utils.DecryptAES256GCM(mchAPIv3Key, request.Resource.AssociatedData, request.Resource.Nonce, request.Resource.Ciphertext)
		// 把获取json字符串转成Transaction对象
		transaction := payments.Transaction{}
		tools.JsontoStruct(plaintext, &transaction)
		// 这里就是解析下单的附属参数
		attchParams := AttchParams{}
		utils2.JsonToStruct(*transaction.Attach, &attchParams)
		fmt.Println("微信支付回调进来了，参数获取：", attchParams)
		if attchParams.Type == "note" {
			fmt.Println("微信支付回调进来了，note----start")
			isBuyFlag := userNoteService.CountUserBuyNote(attchParams.UserId, attchParams.Opid, web.GetSystemId())
			fmt.Println("微信支付回调进来了，note----isBuyFlag", isBuyFlag)
			if !isBuyFlag {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}
			fmt.Println("微信支付回调进来了，note----isBuyFlag---2", isBuyFlag)
			userNoteService.SaveUserNote(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				attchParams.UserId, attchParams.Opid, web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，note----end")
		} else if attchParams.Type == "channel" {
			fmt.Println("微信支付回调进来了，note----start")
			isBuyFlag := userBuyChannelService.CountUserBuyChannel(attchParams.UserId, attchParams.Opid, web.GetSystemId())
			fmt.Println("微信支付回调进来了，note----isBuyFlag", isBuyFlag)
			if !isBuyFlag {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}
			fmt.Println("微信支付回调进来了，note----isBuyFlag---2", isBuyFlag)
			userBuyChannelService.SaveUserBuyChannel(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				attchParams.UserId, attchParams.Opid, web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，note----end")
		} else if attchParams.Type == "special" {
			fmt.Println("微信支付回调进来了，special----start")
			isBuyFlag := userSpecialService.CountUserBuySpecial(attchParams.UserId, attchParams.Opid, web.GetSystemId())
			if !isBuyFlag {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}
			// 订单保存落库
			userSpecialService.SaveUserSpecial(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				attchParams.UserId, attchParams.Opid, web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，special----end")
		} else if attchParams.Type == "coin" {
			fmt.Println("微信支付回调进来了，coin----start")
			isBuyFlag := userWalletService.CountUserWalletRecordsByOutTradeNo(*transaction.OutTradeNo, web.GetSystemId())
			if isBuyFlag > 0 {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}
			// 订单保存落库
			userWalletService.SaveUserWalletRecords(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				web.GetUserId(), web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，coin----end")
		} else if attchParams.Type == "vip" {
			fmt.Println("微信支付回调进来了，vip----start")
			isBuyFlag := userBuyVipService.CountUserBuyVipByOutTradeNo(*transaction.OutTradeNo, web.GetSystemId())
			fmt.Println("微信支付回调进来了，vip----isBuyFlag", isBuyFlag)
			if isBuyFlag > 0 {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}

			// 订单保存落库
			userBuyVipService.SaveUserVipOrder(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				web.GetUserId(), attchParams.VipId, web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，vip----end")
		} else if attchParams.Type == "resume" {
			fmt.Println("支付宝支付回调进来了，resume----start")
			// 订单保存落库
			// 这里就是解析下单的附属参数
			resumeService.UpdateResumePay(attchParams.Opid, 1, "微信", *transaction.TransactionId, web.GetUserId(), web.GetSystemId())
			fmt.Println("支付宝支付回调进来了，resume----end")
		} else if attchParams.Type == "resumetemplate" {
			fmt.Println("微信支付回调进来了，resumetemplate----start")
			isBuyFlag := userResumeTemplateService.CountUserBuyResumeTemplate(attchParams.UserId, attchParams.Opid, web.GetSystemId())
			fmt.Println("微信支付回调进来了，resumetemplate----isBuyFlag", isBuyFlag)
			if !isBuyFlag {
				web.FailCodeMsg(902, "订单已经创建")
				return
			}
			fmt.Println("微信支付回调进来了，note----isBuyFlag---2", isBuyFlag)
			userResumeTemplateService.SaveUserResumeTemplate(
				*transaction.OutTradeNo, *transaction.TransactionId, utils2.StructToJson(transaction), 1, "微信", attchParams.Price,
				attchParams.UserId, attchParams.Opid, web.GetSystemId(), web.GetSystemName())
			fmt.Println("微信支付回调进来了，note----end")
		}
		//微信支付回调返回特殊处理，Flag = 40
		tmp["code"] = "SUCCESS"
		tmp["message"] = "成功"
	} else {
		tmp["code"] = "500"
		tmp["message"] = "失败"
	}
	web.Ok(tmp)
}
